import asyncio
from crawlee.crawlers import ParselCrawler, ParselCrawlingContext
# from crawlee.proxy_configuration import ProxyConfiguration


async def main() -> None:
    # 初始化 ParselCrawler
    crawler = ParselCrawler(
        max_requests_per_crawl=10,
        # 其他可能的参数
        # 创建代理配置
        # proxy_configuration=ProxyConfiguration(
        #     proxy_urls=['http://127.0.0.1:8888',
        #                 'https://127.0.0.1:8888']
        # )
    )

    @crawler.router.default_handler
    async def request_handler(context: ParselCrawlingContext) -> None:
        context.log.info(f'🎯 正在处理: {context.request.url}')

        # 使用 Parsel 选择器提取多种数据
        data = {
            'url': context.request.url,
            'title': context.selector.xpath('//title/text()').get(),
            # 使用 CSS 选择器提取 h1 标签
            'h1': context.selector.css('h1::text').get(),
            # 提取页面中所有链接的数量
            'link_count': len(context.selector.css('a')),
            # 提取 meta 描述
            'description': context.selector.xpath('//meta[@name="description"]/@content').get(),
        }

        # 提取所有段落文本（前3个）
        paragraphs = context.selector.css('p::text').getall()[:3]
        data['paragraphs'] = paragraphs

        # 提取页面的所有图片
        images = context.selector.css('img::attr(src)').getall()
        data['images'] = images

        context.log.info(f'📊 提取数据: {data["title"]}')

        # 存储数据
        await context.push_data(data)

        # 提取链接并加入队列
        enqueued_count = await context.enqueue_links()
        context.log.info(f'🔗 已排队 {enqueued_count} 个新链接')

    # 启动爬虫
    await crawler.run(['https://www.hao123.com'])

if __name__ == '__main__':
    asyncio.run(main())
